/**
*实验四 - 用单向链表实现电话簿
*学号：201531002134
*班级：软工1601
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct poeple
{
    char name[16];  // 姓名
    char tel[12];  //电话号码
}people;

typedef struct LNode
{
    people peo;
    struct LNode *next;   //指向下一个节点的指针
}LNode,* LinkList;

void createList(LinkList &L,int n);                 // 链表的创建
int deleteElem(LinkList &L ,int i);                 //从通讯录中按序号删除第i个元素
int insertElem(LinkList &L , people data, int i);  //在第i个位置插入一组成员记录
void printList(LinkList &L);                     //输出链表

void createList(LinkList &L,int n)
{
    LinkList p,q;
    L = (LinkList)malloc(sizeof(LNode));   //头节点
    L->next = NULL;
    q = L;    //中间节点q
    for (int i=1; i<=n; i++)
    {
        p = (LinkList)malloc(sizeof(LNode));  // 下一个节点
        printf("请输入第%d个用户的姓名：",i);
        scanf("%s",p->peo.name);
        printf("请输入第%d个用户的电话：",i);
        scanf("%s",p->peo.tel);
        q->next = p;
        q = p;
    }
    p->next = NULL;
    printf("创建成功\n");
}

void printList(LinkList &L)
{
    LinkList q;
    int i =1;
    if ( L->next != NULL)
    {
        q = L->next;
        while( q != NULL)
        {
            printf("\n这是第%d个用户\n",i);
            printf("姓名：%s\n",q->peo.name);
            printf("电话：%s\n",q->peo.tel);
            q = q->next;
            i++;
        }
    }
    else{
        printf("\nWARRING!该表为空表！");
    }
}

int deleteElem(LinkList &L ,int i)
{
    LinkList p = L, q;
    int j = 0;
    while (p->next && j<i-1)   //寻找第i个结点，并使p指向其前趋
    {
        p = p->next;
        ++ j;
    }
    if(!(p->next) || j>i-1)
    {
        printf("删除位置不合理\n");
        return 0;
    }
    q = p->next;
    p->next = q->next;
    free(q);
    return 1;
}

int insertElem(LinkList &L , people data, int i)
{
    LinkList p = L , s;
    int j = 0;
    while (p && j<i-1)   //寻找第i-1个结点
    {
        p = p->next;
        ++ j;
    }
    if ( !p || j>i-1 )
    {
        printf("插入位置不合理\n");
        return 0;
    }
    s = (LinkList)malloc(sizeof(LNode));   //新建一个节点
    strcpy(s->peo.name ,data.name);
    strcpy(s->peo.tel,data.tel);
    s->next = p->next;
    p ->next = s;
    return 1;
}

void menu()
{
    printf("***************************菜单****************************\n");
    printf("\t\t 1.创建一个电话簿\n");
    printf("\t\t 2.在第i个位置插入一组数据\n");
    printf("\t\t 3.删除第i个位置的数据\n");
    printf("\t\t 4.显示电话号码簿\n");
    printf("\t\t 0.退出\n");
    printf("***********************************************************\n");
}

/*主函数*/
int main()
{
    int num , n , isCreated=0;
    LinkList peo;
    people data;
    menu();
    while(1)
    {
        printf("请输入选项：");
        scanf("%d",&num);
        switch(num)
        {
        case 1:
            printf("请输入你要创建的用户数：");
            scanf("%d",&n);
            createList(peo,n);
            isCreated = 1;
            break;
        case 2:
            if (!isCreated)
            {
                printf("请先创建电话簿！\n");
                break;
            }
            printf("请输入插入的用户信息：\n");
            printf("姓名：");
            scanf("%s",data.name);
            printf("电话：");
            scanf("%s",data.tel);
            printf("请输入你要插入的位置：");
            scanf("%d",&n);
            insertElem(peo,data,n);
            break;
        case 3:
            if (!isCreated)
            {
                printf("请先创建电话簿！\n");
                break;
            }
            printf("请输入你想要删除的用户序号：");
            scanf("%d",&n);
            deleteElem(peo,n);
            break;
        case 4:
            if (!isCreated)
            {
                printf("请先创建电话簿！\n");
                break;
            }
            printList(peo);
            break;
        case 0:
            return 1;
        default:
            printf("请输入正确选项！");
            break;
        }
    }
    return 0;
}
